﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Diagnostics;

namespace MikroObject
{
    public class Synchronous
    {
        IBackOffice _instance = null;

        public Synchronous()
        {
            if (Config.GetConfig.GetValue(CParams.ProgramTipi, "Mikro V12") == "Mikro V12")
                _instance = new MikroV12();
            else
                _instance = new MikroV14();

            Data.Get.Server = Config.GetConfig.GetValue(CParams.SqlServer, ".");
            Data.Get.Database = Config.GetConfig.GetValue(CParams.SqlDatabase, "");
            Data.Get.User = Config.GetConfig.GetValue(CParams.SqlUserId, "sa");
            Data.Get.Password = Config.GetConfig.GetValue(CParams.SqlPassword, "");

            new Schema().CreateTable();
        }

        public void AnaGrupAktar(DataTable dt)
        {
            if (dt.Rows.Count == 0)
                return;

            SqlTransaction trn = Data.Get.OpenSession();

            string kod = string.Empty;
            string adi = string.Empty;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                kod = dt.Rows[i][0].ToString();
                adi = dt.Rows[i][1].ToString();
                _instance.AddtoAnaGrup(kod, adi, trn);
            }
            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public void KasaAktar(DataTable dt)
        {
            if (dt.Rows.Count == 0)
                return;

            SqlTransaction trn = Data.Get.OpenSession();

            string kod = string.Empty;
            string adi = string.Empty;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                kod = dt.Rows[i][0].ToString();
                adi = dt.Rows[i][1].ToString();
                _instance.AddtoKasa(kod, adi, trn);
            }
            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public void DepoAktar(DataTable dt)
        {
            if (dt.Rows.Count == 0)
                return;

            SqlTransaction trn = Data.Get.OpenSession();

            string kod = string.Empty;
            string adi = string.Empty;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                kod = dt.Rows[i][0].ToString();
                adi = dt.Rows[i][1].ToString();
                _instance.AddtoDepo(kod, adi, trn);
            }
            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public void AltGrupAktar(DataTable dt)
        {
            if (dt.Rows.Count == 0)
                return;

            SqlTransaction trn = Data.Get.OpenSession();

            string kod = string.Empty;
            string adi = string.Empty;
            string anagrupkod = string.Empty;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                kod = dt.Rows[i][0].ToString();
                adi = dt.Rows[i][1].ToString();
                anagrupkod = dt.Rows[i][2].ToString();

                _instance.AddtoAltGrup(kod, adi, anagrupkod, trn);
            }
            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public void CariAktar(DataTable dt)
        {
            if (dt.Rows.Count == 0)
                return;

            SqlTransaction trn = Data.Get.OpenSession();

            string kod = string.Empty;
            string adi = string.Empty;
            string adres1 = string.Empty;
            string adres2 = string.Empty;
            string tel1 = string.Empty;
            string tel2 = string.Empty;
            string fax = string.Empty;
            string ilgili = string.Empty;
            string email = string.Empty;
            string muhkod = string.Empty;
            string vergidaire = string.Empty;
            string vergino = string.Empty;
            string adi2 = string.Empty;


            for (int i = 0; i < dt.Rows.Count; i++)
            {
                kod = dt.Rows[i][0].ToString();
                adi = dt.Rows[i][1].ToString();
                adres1 = dt.Rows[i][2].ToString();
                adres2 = dt.Rows[i][3].ToString();
                tel1 = ExtensionMethods.Mid(dt.Rows[i][4].ToString(), 1, 10);
                tel2 = ExtensionMethods.Mid(dt.Rows[i][5].ToString(), 1, 10);
                fax = ExtensionMethods.Mid(dt.Rows[i][6].ToString(), 1, 10);
                ilgili = dt.Rows[i][7].ToString();
                email = dt.Rows[i][8].ToString();
                muhkod = dt.Rows[i][9].ToString();
                vergidaire = dt.Rows[i][10].ToString();
                vergino = dt.Rows[i][11].ToString();
                adi2 = dt.Rows[i][12].ToString();

                _instance.AddtoTeminci(kod, adi, adi2, tel1, tel2, fax, ilgili, email, muhkod, vergidaire, vergino, adres1, adres2, trn);

            }
            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public void StokAktar(DataTable dt)
        {
            if (dt.Rows.Count == 0)
                return;

            Dictionary<int, int> kdvlist = _instance.KdvList();

            SqlTransaction trn = Data.Get.OpenSession();

            string kod = string.Empty;
            string adi = string.Empty;
            string birim1_ad = string.Empty;
            int birim1_katsayi = 1;
            string birim2_ad = string.Empty;
            int birim2_katsayi = 1;
            int vergi_orani = 0;
            int vergi_sira = 0;
            string teminci = string.Empty;
            string altgrup = string.Empty;
            string anagrup = string.Empty;
            string muhkod = string.Empty;

            decimal fiyat1 = 0;
            decimal fiyat2 = 0;
            decimal fiyat3 = 0;

            StreamWriter sw = new StreamWriter("temp.txt", false);
            sw.WriteLine("Kdv Sıfır Olarak Atılan Ürünler");

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                kod = dt.Rows[i][0].ToString();
                adi = dt.Rows[i][1].ToString();
                birim1_ad = dt.Rows[i][2].ToString();
                if (dt.Rows[i][3] != DBNull.Value) birim1_katsayi = Convert.ToInt32(dt.Rows[i][3]); else birim1_katsayi = 1;
                birim2_ad = dt.Rows[i][4].ToString();
                if (dt.Rows[i][5] != DBNull.Value) birim2_katsayi = Convert.ToInt32(dt.Rows[i][5]); else birim2_katsayi = 1;
                if (dt.Rows[i][6] != DBNull.Value) vergi_orani = Convert.ToInt32(dt.Rows[i][6]); else { vergi_orani = 0; }
                anagrup = dt.Rows[i][7].ToString();
                altgrup = dt.Rows[i][8].ToString();
                teminci = dt.Rows[i][9].ToString();
                muhkod = dt.Rows[i][10].ToString();
                fiyat1 = Convert.ToDecimal(dt.Rows[i][11]);
                fiyat2 = Convert.ToDecimal(dt.Rows[i][12]);
                fiyat3 = Convert.ToDecimal(dt.Rows[i][13]);

                if (vergi_orani == 0)
                    sw.WriteLine(adi);

                if (kdvlist.ContainsKey(vergi_orani))
                    vergi_sira = kdvlist[vergi_orani];
                else
                    vergi_sira = 0;

                _instance.AddToStok(kod, adi, anagrup, birim1_ad, birim1_katsayi, birim2_ad, birim2_katsayi * -1, altgrup, teminci, vergi_sira, muhkod, fiyat1, fiyat2, fiyat3, trn);
            }
            sw.Close();
            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public void DepoSevkAktar(List<SevkEvrak> evraklar)
        {
            if (evraklar.Count == 0)
                return;

            Dictionary<int, int> kdvlist = _instance.KdvList();

            SqlTransaction trn = Data.Get.OpenSession();
            string evrakSeri = Config.GetConfig.GetValue(CParams.SevkSeri, "TRN");
            int evrakSira = 0;
            string stokkodu;
            int vergi_sira;

            foreach (SevkEvrak evr in evraklar)
            {
                evrakSira = _instance.MaxEvrakNo(EvrakTipleri.DepoSevk, evrakSeri, trn);

                int satir = 0;
                foreach (EvrakSatir h in evr.Satirlar)
                {
                    if (h.isStok == true)
                        stokkodu = "S." + h.StokId;
                    else
                        stokkodu = "U." + h.StokId;

                    if (kdvlist.ContainsKey(h.KdvOrani))
                        vergi_sira = kdvlist[h.KdvOrani];
                    else
                        vergi_sira = 0;

                    _instance.BaglantiDuzelt(EvrakTipleri.DepoSevk, h.Id, trn);

                    int shar_id = _instance.SharEkle(EvrakTipleri.DepoSevk, trn, evrakSeri, evrakSira, evr.Tarih, satir, stokkodu, "", "", h.Miktar, h.Miktar * h.Fiyat, vergi_sira, h.KdvOrani, 0, evr.HedefDepo, evr.KaynakDepo, 0, 0, 0);

                    _instance.BaglantiKaydet(EvrakTipleri.DepoSevk, h.Id, shar_id, 0, evrakSeri, evrakSira, trn);

                    satir++;
                }
            }


            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public void AlisAktar(List<Evrak> evraklar)
        {
            if (evraklar.Count == 0)
                return;

            Dictionary<int, int> kdvlist = _instance.KdvList();

            SqlTransaction trn = Data.Get.OpenSession();
            string evrakSeri = "";
            int evrakSira = 0;
            string stokkodu;
            int vergi_sira;
            decimal isk1Tutar = 0;
            decimal isk2Tutar = 0;
            decimal isk3Tutar = 0;
            decimal meblag = 0;
            decimal araToplam = 0;
            decimal[] vergiTutarlari = new decimal[10];
            int charId = 0;

            foreach (Evrak evr in evraklar)
            {
                if (evr.EvrakTip == Evrak.AlisTip.Irsaliye)
                {
                    evrakSeri = Config.GetConfig.GetValue(CParams.AlisIrsaliyeSeri, "AIRS");
                    evrakSira = _instance.MaxEvrakNo(EvrakTipleri.AlisIrsaliyesi, evrakSeri, trn);
                }
                else
                {
                    evrakSeri = Config.GetConfig.GetValue(CParams.AlisFaturaSeri, "AFTR");
                    evrakSira = _instance.MaxEvrakNo(EvrakTipleri.AlisFaturasi, evrakSeri, trn);
                }

                int satir = 0;
                isk1Tutar = 0;
                isk2Tutar = 0;
                isk3Tutar = 0;
                meblag = 0;
                araToplam = 0;
                charId = 0;
                vergiTutarlari = new decimal[10];

                foreach (EvrakSatir h in evr.Satirlar)
                {
                    if (kdvlist.ContainsKey(h.KdvOrani))
                        vergi_sira = kdvlist[h.KdvOrani];
                    else
                        vergi_sira = 0;

                    vergiTutarlari[vergi_sira] += h.KdvTutar;

                    isk1Tutar += h.Isk1Tutar;
                    isk2Tutar += h.Isk2Tutar;
                    isk3Tutar += h.Isk3Tutar;
                    araToplam += (h.Miktar * h.Fiyat);
                    meblag += (h.Tutar + h.KdvTutar);
                }

                if (evr.EvrakTip == Evrak.AlisTip.IrsaliyeliFatura)
                    charId = _instance.CharEkle(EvrakTipleri.AlisFaturasi, trn, evrakSeri, evrakSira, evr.Tarih, meblag, vergiTutarlari, "", evr.CariKod, araToplam, evr.EvrakNo, 0, "FastRest", isk1Tutar, isk2Tutar, isk3Tutar, 0, evr.CariKod);
                else if (evr.EvrakTip == Evrak.AlisTip.FaturalastirilmisIrsaliye)
                {
                    _instance.BaglantiDuzelt(EvrakTipleri.AlisIrsaliyesi, evr.IrsaliyeRecNo, trn);
                    charId = _instance.CharEkle(EvrakTipleri.AlisFaturasi, trn, evrakSeri, evrakSira, evr.Tarih, meblag, vergiTutarlari, "", evr.CariKod, araToplam, evr.EvrakNo, 0, "FastRest", isk1Tutar, isk2Tutar, isk3Tutar, 0, evr.CariKod);
                }

                foreach (EvrakSatir h in evr.Satirlar)
                {
                    stokkodu = "S." + h.StokId;

                    if (kdvlist.ContainsKey(h.KdvOrani))
                        vergi_sira = kdvlist[h.KdvOrani];
                    else
                        vergi_sira = 0;

                    if (evr.EvrakTip == Evrak.AlisTip.Irsaliye)
                        _instance.BaglantiDuzelt(EvrakTipleri.AlisIrsaliyesi, h.Id, trn);
                    else
                        _instance.BaglantiDuzelt(EvrakTipleri.AlisFaturasi, h.Id, trn);

                    int shar_id = 0;
                    if (evr.EvrakTip == Evrak.AlisTip.Irsaliye)
                    {
                        shar_id = _instance.SharEkle(EvrakTipleri.AlisIrsaliyesi, trn, evrakSeri, evrakSira, evr.Tarih, satir, stokkodu, "", "", h.Miktar, h.Miktar * h.Fiyat, vergi_sira, h.KdvTutar, charId, evr.Depo, evr.Depo, h.Isk1Tutar, h.Isk2Tutar, h.Isk3Tutar);
                        _instance.BaglantiKaydet(EvrakTipleri.AlisIrsaliyesi, h.Id, shar_id, charId, evrakSeri, evrakSira, trn);
                    }
                    else
                    {
                        shar_id = _instance.SharEkle(EvrakTipleri.AlisFaturasi, trn, evrakSeri, evrakSira, evr.Tarih, satir, stokkodu, "", "", h.Miktar, h.Miktar * h.Fiyat, vergi_sira, h.KdvTutar, charId, evr.Depo, evr.Depo, h.Isk1Tutar, h.Isk2Tutar, h.Isk3Tutar);
                        _instance.BaglantiKaydet(EvrakTipleri.AlisFaturasi, h.Id, shar_id, charId, evrakSeri, evrakSira, trn);
                    }

                    satir++;
                }
            }


            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                Logging.GetLog.ErrorLog(ex);
                trn.Rollback();
            }
            finally
            {
                if (trn != null)
                {
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                    trn = null;
                }
            }
        }

        public IEnumerable<int> SatisAktar(List<Evrak> evraklar)
        {
            if (evraklar.Count > 0)
            {
                Dictionary<int, int> kdvlist = _instance.KdvList();

                SqlTransaction trn = Data.Get.OpenSession();
                string evrakSeri = "";
                int evrakSira = 0;
                string stokkodu;
                int vergi_sira;
                decimal isk1Tutar = 0;
                decimal isk2Tutar = 0;
                decimal isk3Tutar = 0;
                decimal meblag = 0;
                decimal araToplam = 0;
                decimal[] vergiTutarlari = new decimal[10];
                int charId = 0;
                int satir = 0;
                int index = 1;
                int cariCins = 4;
                if (Config.GetConfig.GetValue(CParams.SatisFaturaTipi, "Kapalı") == "Açık")
                    cariCins = 0;

                evrakSeri = Config.GetConfig.GetValue(CParams.SatisFaturaSeri, "K");

                foreach (Evrak evr in evraklar)
                {
                    evrakSira = _instance.MaxEvrakNo(EvrakTipleri.SatisFaturasi, evrakSeri, trn);

                    satir = 0;
                    isk1Tutar = 0;
                    isk2Tutar = 0;
                    isk3Tutar = 0;
                    meblag = 0;
                    araToplam = 0;
                    charId = 0;
                    vergiTutarlari = new decimal[10];

                    foreach (EvrakSatir h in evr.Satirlar)
                    {
                        if (kdvlist.ContainsKey(h.KdvOrani))
                            vergi_sira = kdvlist[h.KdvOrani];
                        else
                            vergi_sira = 0;

                        vergiTutarlari[vergi_sira] += h.KdvTutar;

                        isk1Tutar += h.Isk1Tutar;
                        isk2Tutar += h.Isk2Tutar;
                        isk3Tutar += h.Isk3Tutar;
                        araToplam += (h.Miktar * h.Fiyat);
                        meblag += (h.Tutar + h.KdvTutar);
                    }

                    charId = _instance.CharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, evr.Tarih, meblag, vergiTutarlari, "", evr.CariKod, araToplam, evr.EvrakNo, 0, "FastRest", isk1Tutar, isk2Tutar, isk3Tutar, cariCins, evr.KasaNo.ToString());

                    foreach (EvrakSatir h in evr.Satirlar)
                    {
                        stokkodu = "U." + h.StokId;

                        if (kdvlist.ContainsKey(h.KdvOrani))
                            vergi_sira = kdvlist[h.KdvOrani];
                        else
                            vergi_sira = 0;

                        _instance.SharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, evr.Tarih, satir, stokkodu, "", "", h.Miktar, h.Miktar * h.Fiyat, vergi_sira, h.KdvTutar, charId, evr.Depo, evr.Depo, h.Isk1Tutar, h.Isk2Tutar, h.Isk3Tutar);
                        satir++;
                    }

                    yield return index;
                    index++;
                }


                try
                {
                    trn.Commit();
                }
                catch (Exception ex)
                {
                    Logging.GetLog.ErrorLog(ex);
                    trn.Rollback();
                }
                finally
                {
                    if (trn != null)
                    {
                        if (trn.Connection != null)
                        {
                            trn.Connection.Close();
                        }
                        trn = null;
                    }
                }
            }
        }
    }
}
